/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.ndj.daoimpl;


import br.com.ndj.conexao.FabricaConexao;
import br.com.ndj.dao.ServidorDAO;
import br.com.ndj.dao.VersaoDoSqlServerDAO;
import br.com.ndj.domain.Servidor;
import br.com.ndj.domain.VersaoDoSqlServer;
import br.com.ndj.exceptions.FabricaConexaoPoolVazioException;
import br.com.ndj.exceptions.ServidorDAOException;
import br.com.ndj.exceptions.VersaoDoSqlServerDAOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Osmar Vilarim
 * 18/09/2014
 */

public class ServidorDAOImpl implements ServidorDAO {
    
    private Connection conn = null;
    private String sql = "";
    private PreparedStatement pstmt = null;
    private List<Servidor> listServidor = new ArrayList<Servidor>();
    
    
    public ServidorDAOImpl() {
        try {
            //conn = new FabricaConexao().abrirConexao();
            conn = FabricaConexao.getInstance().getConnectionFromPool();
        } catch (FabricaConexaoPoolVazioException ex) {
            //Logger.getLogger(LoginDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public boolean cadastrarServidor(Servidor servidor) throws ServidorDAOException{
        boolean retorno = false;

        if (servidor != null) {

            try {

                conn.setAutoCommit(false);
                sql = "INSERT INTO ser_servidor (SER_NOME,SER_USUARIO,SER_SENHA,VER_IDENTIFICADOR) VALUES (?,?,?,?)";
                pstmt = conn.prepareStatement(sql);

                pstmt.setString(1, servidor.getSerNome().trim());
                pstmt.setString(2, servidor.getSerUsuario().trim());
                pstmt.setString(3, servidor.getSerSenha().trim());
                pstmt.setInt(4, servidor.getVersaoDoSqlServer().getVerIdentificador());
                
                int rows = pstmt.executeUpdate();

                if (rows > 0) {
                    System.out.println("Quantidade de linhas inseridas no banco: " + rows);
                }
                conn.commit();
                pstmt.close();

                retorno = true;
            } catch (SQLException e) {

                try {
                    conn.rollback();
                } catch (SQLException x) {
                    throw new ServidorDAOException(ServidorDAOException.ERRO_INSERIR_SERVIDOR, null);
                }

                throw new ServidorDAOException(ServidorDAOException.ERRO_INSERIR_SERVIDOR, null);
            } finally {
                FabricaConexao.getInstance().returnConnectionToPool(conn);
            }

        }

        return retorno;
    }

    @Override
    public boolean editarServidor(Servidor servidor) throws ServidorDAOException {
         boolean retorno = false;

        if (servidor != null) {

            try {
                conn.setAutoCommit(false);
                sql = "UPDATE ser_servidor SET SER_NOME = ?, SER_USUARIO = ?, SER_SENHA = ?, VER_IDENTIFICADOR = ?, WHERE SER_IDENTIFICADOR = ?";

                pstmt = conn.prepareStatement(sql);
                pstmt.setString(1, servidor.getSerNome());
                pstmt.setString(2, servidor.getSerUsuario());
                pstmt.setString(3, servidor.getSerSenha());
                pstmt.setInt(4, servidor.getVersaoDoSqlServer().getVerIdentificador());
                pstmt.setInt(5, servidor.getSerIdentificador());

                int rows = pstmt.executeUpdate();

                if (rows > 0) {
                    System.out.println("Quantidade de linhas inseridas no banco: " + rows);
                    retorno = true;
                }
                conn.commit();
                pstmt.close();

            } catch (SQLException ex) {
                
                try {
                    conn.rollback();
                } catch (SQLException e1) {
                    throw new ServidorDAOException(ServidorDAOException.ERRO_ALTERAR_SERVIDOR, null);
                }
                
                throw new ServidorDAOException(ServidorDAOException.ERRO_ALTERAR_SERVIDOR, null);

            } finally {
                FabricaConexao.getInstance().returnConnectionToPool(conn);
            }
        }
        return retorno;
    }

    @Override
    public boolean excluirServidor(Servidor servidor) throws ServidorDAOException {
        boolean retorno = false;

        try {

            if (servidor.getSerIdentificador()!= 0) {
                sql = "DELETE FROM ser_servidor where SER_IDENTIFICADOR = ?";
                pstmt = conn.prepareStatement(sql);
                pstmt.setInt(1, servidor.getSerIdentificador());
            }

        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }

        try {

            conn.setAutoCommit(false);

            int rows = pstmt.executeUpdate();

            if (rows > 0) {
                System.out.println("Quantidade de linhas excluídas no banco: " + rows);
            }
            conn.commit();
            pstmt.close();

            retorno = true;
        } catch (SQLException e) {

            try {
                conn.rollback();
            } catch (SQLException e1) {
                throw new ServidorDAOException(ServidorDAOException.ERRO_EXCLUIR_SERVIDOR, null);
            }

            throw new ServidorDAOException(ServidorDAOException.ERRO_EXCLUIR_SERVIDOR, null);
        } finally {
            FabricaConexao.getInstance().returnConnectionToPool(conn);
        }

        return retorno;
    }

    @Override
    public List<Servidor> listarServidor() throws ServidorDAOException {
        listServidor = new ArrayList<Servidor>();
        
        try {
            sql = "SELECT SER_IDENTIFICADOR,SER_NOME,SER_USUARIO,SER_SENHA,VER_IDENTIFICADOR FROM ser_servidor";
            pstmt = conn.prepareStatement(sql);

            ResultSet rs = pstmt.executeQuery();

            while (rs.next()) {
                
                Servidor servidor = new Servidor();
              
                servidor.setSerIdentificador(rs.getInt("SER_IDENTIFICADOR"));
                servidor.setSerNome(rs.getString("SER_NOME"));
                servidor.setSerNome(rs.getString("SER_USUARIO"));
                servidor.setSerNome(rs.getString("SER_SENHA"));

                VersaoDoSqlServer versaoDoSqlServer = new VersaoDoSqlServer();
                VersaoDoSqlServerDAOImpl versaoDoSqlServerDAOImpl = new VersaoDoSqlServerDAOImpl();
                versaoDoSqlServer.setVerIdentificador(rs.getInt("VER_IDENTIFICADOR"));
                versaoDoSqlServerDAOImpl.consultarVersaoDoSqlServer(versaoDoSqlServer);
                
                servidor.setVersaoDoSqlServer(versaoDoSqlServer);
  
                this.listServidor.add(servidor);

            }//fim while

            pstmt.close();

        } catch (SQLException e) {
            throw new ServidorDAOException(ServidorDAOException.ERRO_LISTAR_SERVIDOR, null);
        } catch (VersaoDoSqlServerDAOException ex) {
            Logger.getLogger(ServidorDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            FabricaConexao.getInstance().returnConnectionToPool(conn);
        }

        return this.listServidor;
    }

    @Override
    public List<Servidor> listarServidor(Servidor servidor) throws ServidorDAOException {
        listServidor = new ArrayList<Servidor>();
        
        try {

            sql = "SELECT SER_IDENTIFICADOR,SER_NOME,SER_USUARIO,SER_SENHA,VER_IDENTIFICADOR FROM ser_servidor where SER_NOME like ?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, "%"+servidor.getSerNome()+"%");

            ResultSet rs = pstmt.executeQuery();

            while (rs.next()) {
                
                servidor = new Servidor();
              
                servidor.setSerIdentificador(rs.getInt("SER_IDENTIFICADOR"));
                servidor.setSerNome(rs.getString("SER_NOME"));
                servidor.setSerNome(rs.getString("SER_USUARIO"));
                servidor.setSerNome(rs.getString("SER_SENHA"));

                VersaoDoSqlServer versaoDoSqlServer = new VersaoDoSqlServer();
                VersaoDoSqlServerDAOImpl versaoDoSqlServerDAOImpl = new VersaoDoSqlServerDAOImpl();
                versaoDoSqlServer.setVerIdentificador(rs.getInt("VER_IDENTIFICADOR"));
                versaoDoSqlServerDAOImpl.consultarVersaoDoSqlServer(versaoDoSqlServer);
                
                servidor.setVersaoDoSqlServer(versaoDoSqlServer);
  
                this.listServidor.add(servidor);

            }//fim while

            pstmt.close();

        } catch (SQLException e) {
            throw new ServidorDAOException(ServidorDAOException.ERRO_LISTAR_SERVIDOR, null);
        } catch (VersaoDoSqlServerDAOException ex) {
            Logger.getLogger(ServidorDAOImpl.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            FabricaConexao.getInstance().returnConnectionToPool(conn);
        }

        return this.listServidor;
    }
    
    
    
}
